home *** CD-ROM | disk | FTP | other *** search
/ CD/PC Actual 76 / DVD Actual 1 Marzo 2003.iso / Trial / TurboCAD 7.1 Pro / Data.Cab / F24524_SDKDemoCtl.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-11-10  |  14.7 KB  |  591 lines

  1. // SDKDemoCtl.cpp : Implementation of the CSDKDemoCtrl OLE control class.
  2.  
  3. #include "stdafx.h"
  4. #include "SDKDemo.h"
  5. #include "SDKDemoCtl.h"
  6. #include "SDKDemoPpg.h"
  7.  
  8.  
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14.  
  15. // Make a "missing" optional parameter
  16. COleVariant varMissing((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
  17.  
  18. IMPLEMENT_DYNCREATE(CSDKDemoCtrl, COleControl)
  19.  
  20.  
  21. /////////////////////////////////////////////////////////////////////////////
  22. // Message map
  23.  
  24. BEGIN_MESSAGE_MAP(CSDKDemoCtrl, COleControl)
  25.     //{{AFX_MSG_MAP(CSDKDemoCtrl)
  26.     ON_WM_CREATE()
  27.     ON_WM_LBUTTONDOWN()
  28.     ON_WM_LBUTTONUP()
  29.     ON_WM_MOUSEMOVE()
  30.     //}}AFX_MSG_MAP
  31.     ON_OLEVERB(AFX_IDS_VERB_EDIT, OnEdit)
  32.     ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
  33. END_MESSAGE_MAP()
  34.  
  35.  
  36. /////////////////////////////////////////////////////////////////////////////
  37. // Dispatch map
  38.  
  39. BEGIN_DISPATCH_MAP(CSDKDemoCtrl, COleControl)
  40.     //{{AFX_DISPATCH_MAP(CSDKDemoCtrl)
  41.     DISP_PROPERTY_NOTIFY(CSDKDemoCtrl, "FileName", m_strFileName, OnFileNameChanged, VT_BSTR)
  42.     DISP_PROPERTY_NOTIFY(CSDKDemoCtrl, "HideLayers", m_strHideLayers, OnHideLayersChanged, VT_BSTR)
  43.     DISP_PROPERTY_EX(CSDKDemoCtrl, "AllLayers", GetAllLayers, SetNotSupported, VT_BSTR)
  44.     DISP_STOCKPROP_BACKCOLOR()
  45.     //}}AFX_DISPATCH_MAP
  46.     //}}AFX_DISPATCH_MAP
  47.     DISP_FUNCTION_ID(CSDKDemoCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
  48. END_DISPATCH_MAP()
  49.  
  50.  
  51. /////////////////////////////////////////////////////////////////////////////
  52. // Event map
  53.  
  54. BEGIN_EVENT_MAP(CSDKDemoCtrl, COleControl)
  55.     //{{AFX_EVENT_MAP(CSDKDemoCtrl)
  56.     // NOTE - ClassWizard will add and remove event map entries
  57.     //    DO NOT EDIT what you see in these blocks of generated code !
  58.     //}}AFX_EVENT_MAP
  59. END_EVENT_MAP()
  60.  
  61.  
  62. /////////////////////////////////////////////////////////////////////////////
  63. // Property pages
  64.  
  65. // TODO: Add more property pages as needed.  Remember to increase the count!
  66. BEGIN_PROPPAGEIDS(CSDKDemoCtrl, 1)
  67.     PROPPAGEID(CSDKDemoPropPage::guid)
  68. END_PROPPAGEIDS(CSDKDemoCtrl)
  69.  
  70.  
  71. /////////////////////////////////////////////////////////////////////////////
  72. // Initialize class factory and guid
  73.  
  74. IMPLEMENT_OLECREATE_EX(CSDKDemoCtrl, "SDKDEMO.SDKDemoCtrl.1",
  75.     0xa63e6664, 0xc85f, 0x11d0, 0x9b, 0x3b, 0x44, 0x45, 0x53, 0x54, 0, 0)
  76.  
  77.  
  78. /////////////////////////////////////////////////////////////////////////////
  79. // Type library ID and version
  80.  
  81. IMPLEMENT_OLETYPELIB(CSDKDemoCtrl, _tlid, _wVerMajor, _wVerMinor)
  82.  
  83.  
  84. /////////////////////////////////////////////////////////////////////////////
  85. // Interface IDs
  86.  
  87. const IID BASED_CODE IID_DSDKDemo =
  88.         { 0xa63e6662, 0xc85f, 0x11d0, { 0x9b, 0x3b, 0x44, 0x45, 0x53, 0x54, 0, 0 } };
  89. const IID BASED_CODE IID_DSDKDemoEvents =
  90.         { 0xa63e6663, 0xc85f, 0x11d0, { 0x9b, 0x3b, 0x44, 0x45, 0x53, 0x54, 0, 0 } };
  91.  
  92.  
  93. /////////////////////////////////////////////////////////////////////////////
  94. // Control type information
  95.  
  96. static const DWORD BASED_CODE _dwSDKDemoOleMisc =
  97.     OLEMISC_ACTIVATEWHENVISIBLE |
  98.     OLEMISC_SETCLIENTSITEFIRST |
  99.     OLEMISC_INSIDEOUT |
  100.     OLEMISC_CANTLINKINSIDE |
  101.     OLEMISC_RECOMPOSEONRESIZE;
  102.  
  103. IMPLEMENT_OLECTLTYPE(CSDKDemoCtrl, IDS_SDKDEMO, _dwSDKDemoOleMisc)
  104.  
  105.  
  106. /////////////////////////////////////////////////////////////////////////////
  107. // CSDKDemoCtrl::CSDKDemoCtrlFactory::UpdateRegistry -
  108. // Adds or removes system registry entries for CSDKDemoCtrl
  109.  
  110. BOOL CSDKDemoCtrl::CSDKDemoCtrlFactory::UpdateRegistry(BOOL bRegister)
  111. {
  112.     // TODO: Verify that your control follows apartment-model threading rules.
  113.     // Refer to MFC TechNote 64 for more information.
  114.     // If your control does not conform to the apartment-model rules, then
  115.     // you must modify the code below, changing the 6th parameter from
  116.     // afxRegInsertable | afxRegApartmentThreading to afxRegInsertable.
  117.  
  118.     if (bRegister)
  119.         return AfxOleRegisterControlClass(
  120.             AfxGetInstanceHandle(),
  121.             m_clsid,
  122.             m_lpszProgID,
  123.             IDS_SDKDEMO,
  124.             IDB_SDKDEMO,
  125.             afxRegInsertable | afxRegApartmentThreading,
  126.             _dwSDKDemoOleMisc,
  127.             _tlid,
  128.             _wVerMajor,
  129.             _wVerMinor);
  130.     else
  131.         return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
  132. }
  133.  
  134.  
  135. /////////////////////////////////////////////////////////////////////////////
  136. // CSDKDemoCtrl::CSDKDemoCtrl - Constructor
  137.  
  138. CSDKDemoCtrl::CSDKDemoCtrl() :
  139.     m_bFirstDraw(TRUE),
  140.     m_pIApp(NULL),
  141.     m_pIDrawing(NULL),
  142.     m_pView(NULL),
  143.     m_ptMouseDown(CPoint(0, 0)),
  144.     m_dragX(0),
  145.     m_dragY(0),
  146.     m_bDragging(FALSE),
  147.     m_pDragGraphic(NULL)
  148. {
  149.     InitializeIIDs(&IID_DSDKDemo, &IID_DSDKDemoEvents);
  150.     VariantInit(&m_dragOutline);
  151. }
  152.  
  153.  
  154. /////////////////////////////////////////////////////////////////////////////
  155. // CSDKDemoCtrl::~CSDKDemoCtrl - Destructor
  156.  
  157. CSDKDemoCtrl::~CSDKDemoCtrl()
  158. {
  159.     VariantClear(&m_dragOutline);
  160.     CloseDrawing();
  161.     if (m_pIApp != NULL)
  162.         m_pIApp->Release();
  163. }
  164.  
  165. BOOL CSDKDemoCtrl::OpenDrawing(const CString& strFileName)
  166. {
  167.     if (m_pIApp == NULL)
  168.         return FALSE;
  169.     
  170.     Drawings* pDrawings;
  171.     HRESULT hRes = m_pIApp->get_Drawings(&pDrawings);
  172.     if (FAILED(hRes))
  173.         return FALSE;
  174.  
  175.     // Get the file name into a BSTR
  176.     BSTR bstrPath = strFileName.AllocSysString();
  177.  
  178.     // Add the drawing to the drawings collection
  179.     IDrawing* pIDrawing;
  180.     hRes = pDrawings->Open(bstrPath, &varMissing, &varMissing, &pIDrawing);
  181.  
  182.     // Free the system memory for the BSTR
  183.     ::SysFreeString(bstrPath);
  184.  
  185.     if (SUCCEEDED(hRes))
  186.     {
  187.         Views* pViews;
  188.         hRes = pIDrawing->get_Views(&pViews);
  189.         if (SUCCEEDED(hRes))
  190.         {
  191.             View* pView;
  192.             hRes = pViews->Add(&varMissing, &varMissing, &pView);
  193.             if (SUCCEEDED(hRes))
  194.             {
  195.                 CloseDrawing();
  196.  
  197.                 m_pIDrawing = pIDrawing;
  198.                 m_pView = pView;
  199.                 Layers* pLayers;
  200.                 if (SUCCEEDED(m_pIDrawing->get_Layers(&pLayers)))
  201.                 {
  202.                     COleVariant varIndex(0L);
  203.                     for ( ; ; varIndex.lVal++)
  204.                     {
  205.                         Layer* pLayer;
  206.                         if (FAILED(pLayers->get_Item(&varIndex, &pLayer)))
  207.                             break;
  208.                         BSTR bstrName = NULL;
  209.                         if (SUCCEEDED(pLayer->get_Name(&bstrName)))
  210.                         {
  211.                             CString str(bstrName);
  212.                             if (!m_strAllLayers.IsEmpty())
  213.                                 m_strAllLayers += "\n";
  214.                             m_strAllLayers += str;
  215.                             ::SysFreeString(bstrName);
  216.                         }
  217.                     }
  218.                 }
  219.                 InvalidateControl();
  220.             }
  221.             pViews->Release();
  222.         }
  223.         if (FAILED(hRes))
  224.         {
  225.             pIDrawing->Close(&varMissing, &varMissing, &varMissing);
  226.             pIDrawing->Release();
  227.         }
  228.     }
  229.     pDrawings->Release();
  230.     return SUCCEEDED(hRes);
  231. }
  232.  
  233. void CSDKDemoCtrl::CloseDrawing()
  234. {
  235.     if (m_pDragGraphic != NULL)
  236.     {
  237.         m_pDragGraphic->Release();
  238.         m_pDragGraphic = NULL;
  239.     }
  240.     m_bDragging = FALSE;
  241.  
  242.     m_strAllLayers.Empty();
  243.     m_strHideLayers.Empty();
  244.     if (m_pView != NULL)
  245.     {
  246.         m_pView->Release();
  247.         m_pView = NULL;
  248.     }
  249.     if (m_pIDrawing != NULL)
  250.     {
  251.         m_pIDrawing->Close(&varMissing, &varMissing, &varMissing);
  252.         m_pIDrawing->Release();
  253.         m_pIDrawing = NULL;
  254.     }
  255.     m_bFirstDraw = TRUE;
  256. }
  257.  
  258.  
  259. /////////////////////////////////////////////////////////////////////////////
  260. // CSDKDemoCtrl::OnDraw - Drawing function
  261.  
  262. void CSDKDemoCtrl::OnDraw(
  263.             CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
  264. {
  265.     {
  266.         CBrush colorBrush;
  267.         CBrush* backBrush;
  268.         if (m_pView == NULL)
  269.             backBrush = CBrush::FromHandle((HBRUSH)GetStockObject(LTGRAY_BRUSH));
  270.         else
  271.         {
  272.             colorBrush.CreateSolidBrush(GetBackColor());
  273.             backBrush = &colorBrush;
  274.         }
  275.         pdc->FillRect(rcBounds, backBrush);
  276.     }
  277.     if (m_pView == NULL)
  278.         return;
  279.  
  280.     HDC hDC = pdc->m_hDC;
  281.     m_pView->put_Update(FALSE);
  282.     m_pView->put_DC((long)hDC);
  283.     m_pView->put_MappingMode(MM_TEXT);
  284.     m_pView->put_Margins(FALSE);
  285.     m_pView->put_FixedAspectRatio(TRUE);
  286.     m_pView->put_ScreenLeft(rcBounds.left);
  287.     m_pView->put_ScreenTop(rcBounds.top);
  288.     m_pView->put_ScreenWidth(rcBounds.Width());
  289.     m_pView->put_ScreenHeight(rcBounds.Height());
  290.     if (m_bFirstDraw)
  291.     {
  292.         m_bFirstDraw = FALSE;
  293.         m_pView->ZoomToExtents();
  294.     }
  295.     m_pView->Refresh();
  296. }
  297.  
  298.  
  299. /////////////////////////////////////////////////////////////////////////////
  300. // CSDKDemoCtrl::DoPropExchange - Persistence support
  301.  
  302. void CSDKDemoCtrl::DoPropExchange(CPropExchange* pPX)
  303. {
  304.     ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
  305.     COleControl::DoPropExchange(pPX);
  306.  
  307.     PX_String(pPX, _T("FileName"), m_strFileName);
  308.     PX_String(pPX, _T("HideLayers"), m_strHideLayers);
  309. }
  310.  
  311.  
  312. /////////////////////////////////////////////////////////////////////////////
  313. // CSDKDemoCtrl::OnResetState - Reset control to default state
  314.  
  315. void CSDKDemoCtrl::OnResetState()
  316. {
  317.     COleControl::OnResetState();  // Resets defaults found in DoPropExchange
  318.  
  319.     // TODO: Reset any other control state here.
  320. }
  321.  
  322.  
  323. /////////////////////////////////////////////////////////////////////////////
  324. // CSDKDemoCtrl::AboutBox - Display an "About" box to the user
  325.  
  326. void CSDKDemoCtrl::AboutBox()
  327. {
  328.     CDialog dlgAbout(IDD_ABOUTBOX_SDKDEMO);
  329.     dlgAbout.DoModal();
  330. }
  331.  
  332.  
  333. /////////////////////////////////////////////////////////////////////////////
  334. // CSDKDemoCtrl message handlers
  335.  
  336. void CSDKDemoCtrl::OnFileNameChanged() 
  337. {
  338.     OpenDrawing(m_strFileName);
  339.     SetModifiedFlag();
  340. }
  341.  
  342. UINT CountStrings(const char* lpsz)
  343. {
  344.     if (lpsz == NULL)
  345.         return 0;
  346.     UINT n = 0;
  347.     const char* p = lpsz;
  348.     while (*p)
  349.     {
  350.         ++n;
  351.         p = strchr(p, '\n');
  352.         if (p == NULL)
  353.             break;
  354.         ++p;
  355.     }
  356.     return n;
  357. }
  358.  
  359.  
  360. BOOL CSDKDemoCtrl::PreCreateWindow(CREATESTRUCT& cs) 
  361. {
  362.     // Connect to the server
  363.     static const CLSID CLSID_XApplication = {0x6A481801,0xE531,0x11CF,{0xA1,0x15,0x00,0xA0,0x24,0x15,0x8D,0xAF}};
  364.     static const IID IID_IApplication = {0x6A481101,0xE531,0x11CF,{0xA1,0x15,0x00,0xA0,0x24,0x15,0x8D,0xAF}};
  365.  
  366.     HRESULT hRes = CoCreateInstance(
  367.         CLSID_XApplication,    //Class identifier (CLSID) of the object
  368.         NULL,    //Object is or isn't part of an aggregate
  369.         CLSCTX_INPROC_SERVER,    //Context for running executable code
  370.         IID_IApplication,    //Interface identifier
  371.         (void**)&m_pIApp    //Points to requested interface pointer
  372.     );
  373.  
  374.     if (FAILED(hRes))
  375.     {
  376.         AfxMessageBox("Couldn't create application object (in-process server)!");
  377.         return FALSE;
  378.     }
  379.     
  380.     return COleControl::PreCreateWindow(cs);
  381. }
  382.  
  383. int CSDKDemoCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  384. {
  385.     if (COleControl::OnCreate(lpCreateStruct) == -1)
  386.         return -1;
  387.     
  388.     // If we are started from a property set with a FileName
  389.     // tTry to open the drawing now
  390.     if (!m_strFileName.IsEmpty())
  391.         OpenDrawing(m_strFileName);
  392.     
  393.     return 0;
  394. }
  395.  
  396. void CSDKDemoCtrl::OnHideLayersChanged() 
  397. {
  398.     if (m_pIDrawing != NULL)
  399.     {
  400.         Layers* pLayers;
  401.         if (SUCCEEDED(m_pIDrawing->get_Layers(&pLayers)))
  402.         {
  403.             COleVariant varIndex(0L);
  404.             for ( ; ; varIndex.lVal++)
  405.             {
  406.                 Layer* pLayer;
  407.                 if (FAILED(pLayers->get_Item(&varIndex, &pLayer)))
  408.                     break;
  409.                 pLayer->put_Visible(TRUE);
  410.                 pLayer->Release();
  411.             }
  412.             for (int i = 0; ; i++)
  413.             {
  414.                 CString str;
  415.                 if (!AfxExtractSubString(str, m_strHideLayers, i, '\n'))
  416.                     break;
  417.                 if (!str.IsEmpty())
  418.                 {
  419.                     Layer* pLayer;
  420.                     COleVariant varName(str);
  421.                     if (SUCCEEDED(pLayers->get_Item(&varName, &pLayer)))
  422.                     {
  423.                         pLayer->put_Visible(FALSE);
  424.                         pLayer->Release();
  425.                     }
  426.                 }
  427.             }
  428.         }
  429.     }
  430.         
  431.     SetModifiedFlag();
  432. }
  433.  
  434. BSTR CSDKDemoCtrl::GetAllLayers() 
  435. {
  436.     return m_strAllLayers.AllocSysString();
  437. }
  438.  
  439. BOOL CSDKDemoCtrl::BeginDrag(const CPoint& point)
  440. {
  441.     VariantClear(&m_dragOutline);
  442.     SAFEARRAYBOUND bound;
  443.     bound.cElements = 0;
  444.     bound.lLbound = 0;
  445.     m_dragOutline.vt = VT_ARRAY|VT_R8;
  446.     m_dragOutline.parray = ::SafeArrayCreate(VT_R8, 1, &bound);
  447.     HRESULT hRes = m_pDragGraphic->CreateDragOutline(&m_dragOutline);
  448.     if (FAILED(hRes))
  449.         return FALSE;
  450.  
  451.     m_bDragging = TRUE;
  452.     m_pDragGraphic->put_Visible(FALSE);
  453.     InvalidateControl();
  454.     UpdateWindow();
  455.  
  456.     SetCapture();
  457.     CDC* pDC = GetDC();
  458.     m_pView->put_DC((long)pDC->m_hDC);
  459.     VARIANT varState;
  460.     varState.vt = VT_I4;
  461.     varState.lVal = imsiDragBegin;
  462.     hRes = m_pView->DragOutline(&m_dragOutline, m_ptMouseDown.x, m_ptMouseDown.y, &varState);
  463.     varState.lVal = imsiDragContinue;
  464.     hRes = m_pView->DragOutline(&m_dragOutline, point.x, point.y, &varState);
  465.     ReleaseDC(pDC);
  466.     return TRUE;
  467. }
  468.  
  469. void CSDKDemoCtrl::Drag(const CPoint& point)
  470. {
  471.     if (m_pView == NULL)
  472.         return;
  473.  
  474.     CDC* pDC = GetDC();
  475.     m_pView->put_DC((long)pDC->m_hDC);
  476.     VARIANT varState;
  477.     varState.vt = VT_I4;
  478.     varState.lVal = imsiDragContinue;
  479.     HRESULT hRes = m_pView->DragOutline(&m_dragOutline, point.x, point.y, &varState);
  480.     ReleaseDC(pDC);
  481. }
  482.  
  483. void CSDKDemoCtrl::EndDrag(const CPoint& point)
  484. {
  485.     m_bDragging = FALSE;
  486.     ReleaseCapture();
  487.     if (m_pView == NULL || m_pDragGraphic == NULL)
  488.         return;
  489.  
  490.     CDC* pDC = GetDC();
  491.     m_pView->put_DC((long)pDC->m_hDC);
  492.     VARIANT varState;
  493.     varState.vt = VT_I4;
  494.     varState.lVal = imsiDragEnd;
  495.     HRESULT hRes = m_pView->DragOutline(&m_dragOutline, point.x, point.y, &varState);
  496.     ReleaseDC(pDC);
  497.  
  498.     VariantClear(&m_dragOutline);
  499.  
  500.     double dx, dy;
  501.     hRes = m_pView->ScreenToView(point.x, point.y, &dx, &dy);
  502.     dx -= m_dragX;
  503.     dy -= m_dragY;
  504.     hRes = m_pDragGraphic->MoveRelative(dx, dy, 0.0, NULL);
  505.     m_pDragGraphic->put_Visible(TRUE);
  506.     m_pDragGraphic->Release();
  507.     m_pDragGraphic = NULL;
  508.     InvalidateControl();
  509. }
  510.  
  511. void CSDKDemoCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
  512. {
  513.     m_ptMouseDown = point;
  514.     if (m_pDragGraphic != NULL)
  515.     {
  516.         m_pDragGraphic->Release();
  517.         m_pDragGraphic = NULL;
  518.     }
  519.  
  520.     if (m_pView != NULL)
  521.     {
  522.         HRESULT hRes = m_pView->ScreenToView(point.x, point.y, &m_dragX, &m_dragY);
  523.         PickResult* pickResult;
  524.         hRes = m_pView->PickPoint(m_dragX, m_dragY, 
  525.             &varMissing, // Aperture
  526.             &varMissing, // TopLevel, 
  527.             &varMissing, // Arcs 
  528.             &varMissing, // Text 
  529.             &varMissing, // Segments 
  530.             &varMissing, // Blocks 
  531.             &varMissing, // Invisible 
  532.             &pickResult);
  533.         if (SUCCEEDED(hRes))
  534.         {
  535.             long lCount = 0;
  536.             hRes = pickResult->get_Count(&lCount);
  537.             if (lCount > 0)
  538.             {
  539.                 COleVariant varIndex(0L);
  540.                 PickEntry* pickEntry;
  541.                 hRes = pickResult->get_Item(&varIndex, &pickEntry);
  542.                 if (SUCCEEDED(hRes))
  543.                 {
  544.                     IGraphic* pIGraphic;
  545.                     hRes = pickEntry->get_Graphic(&pIGraphic);
  546.                     if (SUCCEEDED(hRes))
  547.                         m_pDragGraphic = pIGraphic;
  548.                     pickEntry->Release();
  549.                 }
  550.             }
  551.             pickResult->Release();
  552.         }
  553.     }
  554.  
  555.     COleControl::OnLButtonDown(nFlags, point);
  556. }
  557.  
  558. void CSDKDemoCtrl::OnLButtonUp(UINT nFlags, CPoint point) 
  559. {
  560.     if (m_bDragging)
  561.         EndDrag(point);
  562.     else if (m_pDragGraphic != NULL)
  563.     {
  564.         m_pDragGraphic->Release();
  565.         m_pDragGraphic = NULL;
  566.     }
  567.     
  568.     COleControl::OnLButtonUp(nFlags, point);
  569. }
  570.  
  571. void CSDKDemoCtrl::OnMouseMove(UINT nFlags, CPoint point) 
  572. {
  573.     if (m_pDragGraphic != NULL && !m_bDragging && (nFlags & MK_LBUTTON))
  574.     {
  575.         if (!BeginDrag(point))
  576.         {
  577.             m_pDragGraphic->Release();
  578.             m_pDragGraphic = NULL;
  579.         }
  580.     }
  581.     else if (m_bDragging)
  582.     {
  583.         if (nFlags & MK_LBUTTON)
  584.             Drag(point);
  585.         else
  586.             EndDrag(point);
  587.     }
  588.     
  589.     COleControl::OnMouseMove(nFlags, point);
  590. }
  591.